package com.huazai.study;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class 获取类的运行结构 {
    public static void main(String[] args) {

        try {
            User user = new User();
            Class<? extends User> c1 = user.getClass();
            //获取类名
            System.out.println(c1.getName());
            System.out.println(c1.getSimpleName());
            System.out.println("==========================================");
            //获得该类中全部的属性,getFields()只能找到public范围的属性
            Field[] fields = c1.getDeclaredFields();
            for (Field field : fields) {
                System.out.println(field);
            }
            //获得指定的类中属性
            Field declaredField = c1.getDeclaredField("m");
            System.out.println(declaredField);
            //获得本类及其父类的所有public方法
            Method[] methods = c1.getMethods();
            for (Method method : methods) {
                System.out.println(method);
            }
            //获得本类的所有方法
            System.out.println("==========================================");
            Method[] methods1 = c1.getDeclaredMethods();
            for (Method method : methods1) {
                System.out.println(method);
            }
            /**
             * 获得指定的方法,需要注意的是private权限的方法是不能被获取到的
             * 之所以需要getMethod的第二个parameterTypes参数
             *  是因为有方法的重载，所以需要参数来确定具体的某个方法
             */
            Method test2 = c1.getMethod("test2", String.class);
            System.out.println(test2);
            Method test = c1.getMethod("test1",null);
            System.out.println(test);
            //获取指定的构造方法
            System.out.println("==========================================");
            Constructor<?>[] constructors = c1.getConstructors();
            for (Constructor<?> constructor : constructors) {
                System.out.println(constructor);
            }//仅获得public方法
            Constructor<?>[] constructors2 = c1.getDeclaredConstructors();
            for (Constructor<?> constructor : constructors2) {
                System.out.println(constructor);
            }//获取所有方法
            //同理，可以获得指定的构造器

        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}